#include "contrai.h"

Contrai::Contrai(Grafo *grafoI, Grafo *grafoC, int metodo, vector<int> **mV){
  

  //printf("em contrai: adj size is really %d\n",grafoC->adj.size());

  int n = grafoI->adj.size();
  
  grafoIni = grafoI;
  grafoComp = grafoC;
  
  mapaVolta = mV;
  
  mapaIda = (int *) malloc((n+1)* sizeof(int));

  //printf("** em contrai: adj size is really %d\n",grafoComp->adj.size());
  
  constroiMapas(metodo);

 // printf("** em apos cont mapas contrai: adj size is really %d\n",grafoComp->adj.size());
  
  constroiGrafoComp();

}

void Contrai::constroiMapas(int metodo){
  
  if(metodo == 0){	//ajeitar o metodo
    Emparelhamento objEmp(grafoIni, metodo); //ajeitar o tipo

    //printf("**%% em contrai: adj size is really %d\n",grafoComp->adj.size());

    nV = objEmp.mapeia(mapaIda, mapaVolta);
    
  }else{
    //grau minimo
  }
  
}
  
void Contrai::constroiGrafoComp(void){
  
  vizinho viz;
  int adjnc[nV];


  //printf("adj size is really %d\n",grafoComp->adj.size());
  
  grafoComp->pesoMax = grafoIni->pesoMax;
  
  grafoComp->vPeso = (int *) malloc(nV * sizeof(int));
  
  //atribui o peso de cada nó
  for(int i = 0; i < nV; ++i){ 

    grafoComp->vPeso[i] = 0;
    
    for(unsigned int j = 0; j < (*mapaVolta)[i].size(); ++j){
      grafoComp->vPeso[i] += grafoIni->vPeso[(*mapaVolta)[i][j]];
    }  
  }
  
  //constroi o grafo


  for(int i = 0; i < nV; ++i){
    vector<vizinho> t;
    grafoComp->adj.push_back(t);

    memset(adjnc, 0, sizeof(adjnc));
    
    //descobre quais os vizinhos do vert i
    for(unsigned int j = 0; j < (*mapaVolta)[i].size(); ++j){

      for(unsigned int k = 0; k < grafoIni->adj[(*mapaVolta)[i][j]].size(); ++k){

	if(mapaIda[grafoIni->adj[(*mapaVolta)[i][j]][k].v] == i) continue;

	adjnc[mapaIda[grafoIni->adj[(*mapaVolta)[i][j]][k].v]] += grafoIni->adj[(*mapaVolta)[i][j]][k].peso;
      }
    }
    
    //cria lista de adj do vertice i
    for(int j = 0; j < nV; ++j){
      
      if(adjnc[j] == 0) continue;
      
      viz.v = j;
      viz.peso = adjnc[j];

      //printf("%d (%d) ", j, adjnc[j]);
      
      grafoComp->adj[i].push_back(viz);

    }
    //printf("\n");
  } 
}
